home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Code Resources / Eclectic CDEFs / Gauss CDEF Folder / Gauss CDEF Info next >
Text File  |  1997-03-06  |  15KB  |  327 lines

  1. Gauss CDEF v 1.0
  2. ================
  3. Copyright © Sebastiano Pilla 1996
  4. All rights reserved
  5. Original NeoTextBox source code Copyright © by Bryan K. Ressler, ported to Pascal by Peter N. Lewis
  6.  
  7.  
  8.  
  9. General Information
  10. -------------------
  11. This CDEF draws application-specified blocks of text within a window.
  12.  
  13. Additionally, by setting the appropriate variation codes, the Gauss CDEF can honor the owning window's text settings, honor the colors in a 'cctb' resource, display visual cues that provide the 3D-like appearance outlined in the develop 15 article "Working in the Third Dimension".
  14.  
  15.  
  16. Contents of the Gauss CDEF Folder
  17. ---------------------------------
  18. - Gauss CDEF Info: the documentation file you are reading now
  19. - GaussCDEF.p: Pascal source code of the Gauss control definition function
  20. - GaussCDEF.rsrc: compiled code for any 68K microprocessor of the Gauss control definition function
  21. - GaussCDEF.π: THINK Pascal project for compiling the GaussCDEF resource
  22. - GaussCDEF68020.rsrc: compiled code for 68020-68030-68040 microprocessors of the Gauss control definition function
  23. - GaussCDEFStub.p: Pascal source code of the Gauss control definition function, disguised to use the JumpCDEF debugging stub
  24. - NeoTextBox.p: Pascal source code for the NeoTextBox function, a replacement of the TETextBox Toolbox call
  25.  
  26.  
  27. How to create a Gauss control
  28. -----------------------------
  29. The file 'GaussCDEF.rsrc' contains the compiled code of the definition procedure as a resource of type 'CDEF' with ID of 131.
  30.  
  31. To incorporate the Gauss CDEF in your applications, just open the 'GaussCDEF.rsrc' file with ResEdit (or any other suitable resource editor), copy the CDEF resource and paste it into your application's resource file.
  32.  
  33. For creating a Gauss control:
  34.  
  35. in the resource file of your project create a 'CNTL' resource and put into its ProcID field the number
  36.  
  37.         (131 * 16) + variation code
  38.         
  39. then in your program call
  40.  
  41.         textDisplayHdl := GetNewControl(kTextDisplayID, myWindow)
  42.  
  43. where kTextDisplayID is the ID of the 'CNTL' resource and myWindow is a pointer to one of your windows.
  44.  
  45. The Gauss CDEF makes a very peculiar usage of the fields in the control template, so be sure to read the section titled 'Control template usage'.
  46.  
  47. You can also call the NewControl trap, passing it basically the same parameters you enter in the 'CNTL' resource template.
  48.  
  49.  
  50. Variation Codes
  51. ---------------
  52. A number of possible variation codes can be added to the procID field to obtain special effects. These variation codes are:
  53.  
  54.     0: draw the control's title only
  55.     1: draw the control's title, followed by the number in the refCon field
  56.     2: draw only the value in the refCon field, ignoring the control's title
  57.     4: draw the text pointed to by the handle stored in the refCon field
  58.     8: draw the text using the owning window's text characteristics (font, size, style)
  59.  
  60. You can add other variation codes, henceforth called extended variation codes, to the contrlMax field of the control template. These extended variation codes are:
  61.  
  62.     256: draw the control's boundary rectangle
  63.     512: draw always the control in the active (enable) state
  64.     1024: draw a 3D-like effect around the control
  65.     2048: draw ignoring the colors specified in any 'cctb' resource
  66.  
  67. Note that not all combinations of (normal and extended) variation codes are legal. If you specify one of the illegal combinations, the Gauss CDEF discards it and reverts to another legal combination by itself.
  68. The illegal combinations and the Gauss CDEF actions are:
  69.  
  70.     2 + 1, 2 + 4, 2 + 1 + 4: the CDEF reverts to the 2 variation code, discarding 1 and 4
  71.     1 + 4: the CDEF reverts to the 1 variation code, discarding 4
  72.     1024 - 256: you can't have a 3D effect without a boundary rectangle, so the CDEF discards the
  73.                 1024 variation code
  74.  
  75.  
  76. Control template usage
  77. ----------------------
  78. This section describes how to set the various values of a control template to satisfy the requirements of the Gauss CDEF. The symbols '***' near to a field mean that this field is used in a non-standard way. The following table fits a 640 pixel wide screen in a 9 point monospaced font; you may need to expand the window to see the correct text wrapping.
  79.  
  80. -    BoundsRect:         the boundary rectangle in which the control will be drawn
  81.     
  82. -    *** Value ***:         the text alignment to be applied to the text, specified as follows:
  83.     
  84.                             0: default flush setting (resolves to left flushing on Roman script)
  85.                             1: center justification on all scripts
  86.                             -1: right flush on all scripts
  87.                             -2: left flush on all scripts
  88.                             128: full justification
  89.                             
  90.                         note that only the low-order byte of this field is actually meaningful to the
  91.                         Gauss CDEF
  92.                         
  93. -    Visible:            whether the control is initially visible or not
  94.     
  95. -    *** Max ***:        the extended variation codes, as outlined above; though only the high-order
  96.                         byte of this field is meaningful to the Gauss CDEF, this field should always
  97.                         be greater than 128;
  98.  
  99. -    *** Min ***:        the effect kind (none, inset, raised) when the 1024 extended variation code
  100.                         is set; the effect kind is specified as follows:
  101.                         
  102.                             Min < -100 gives the inset effect
  103.                             Min = -100 gives no effect, even if the 1024 variation code is set
  104.                             Min > -100 gives the raised effect
  105.                         
  106.                         note that this field should always be less than -2
  107.  
  108. -    ProcID:                [(Gauss CDEF resource ID) * 16] + variation code; note that all extended
  109.                         variation codes must go into the Max field, not here
  110.  
  111. -    *** RefCon ***:        32-bit value with different meanings, depending on the current set
  112.                         of variation codes; these meanings are explained in the following table:
  113.                         
  114.                             var. code                meaning of RefCon
  115.                             ---------                -----------------
  116.                             0                        ignored (can be set to anything)
  117.                             
  118.                             1                        value appended to the control's title, formatted
  119.                                                     as a signed 32-bit integer
  120.                                                     
  121.                             2                        value formatted as a signed 32-bit integer
  122.                             
  123.                             4                        handle to the block of text to be displayed,
  124.                                                     allocated and disposed by the calling application
  125.  
  126. -    Title:                control title; ignored if the 2 or 4 variation codes are set
  127.  
  128.  
  129. The following summary provides a quick overview of the above table:
  130.  
  131.     procID : (16 * CDEF ID) + variation code, where variation code = 0, 1, 2, 4, 8
  132.     max : extended variation code = 256, 512, 1024, 2048; must be max >= 128
  133.     min : effect kind (inset if < -100, raised if > -100, none if = -100); must be min <= -2
  134.     value : text justification = 0, 1, -1, -2, 128
  135.     refCon : 'real' control value or text handle
  136.  
  137.  
  138. Examples
  139. --------
  140. Making the Gauss CDEF do what you want is not straightforward, as anyone reading the previous section can notice. In this section I'll try to explain the creation of a control using the Gauss CDEF.
  141.  
  142. The approach I think the best is: set a goal, identify the core functionality of the Gauss CDEF needed to achieve that goal, and finally decide the appearance of the Gauss CDEF.
  143.  
  144.  
  145. Example #1: a progress window
  146. +++++++++++++++++++++++++++++
  147. Think about the Finder when it copies some files: it puts a window when it displays the number of files remaining to be copied. This window contains (besides a progress bar, which of course you can implement with the Celsius CDEF) a string of text and a count of the files remaining to be copied.
  148.  
  149. Goal: Displaying the string "Files remaining to be copied: xxx", where xxx is the number of files.
  150.  
  151. Core functionality: Draw the string and the value in the refCon
  152.                     ** This means adding 1 to the procID field **
  153.  
  154. Appearance: Use System's font characteristics, don't draw neither the boundary rectangle nor the 3D effect, draw always in the active state, ignore any 'cctb'
  155.                     ** This means adding 512 + 2048 = 2560 to the Max field **
  156.  
  157. Let's create the 'CNTL' ID 128 template like:
  158.  
  159.     BoundsRect: large enough to hold all the text, including the number
  160.     Value: 0 (default flush settings)
  161.     Visible: false
  162.     Max: 128 + 512 + 2048 = 2688 (remember, Max >= 128 always)
  163.     Min: -100 (no effect)
  164.     ProcID: (CDEF ID * 16) + 1
  165.     RefCon: we'll set it in the code
  166.     Title: "Files remaining to be copied:  "
  167.  
  168. The code then may looks like:
  169.  
  170.     CONST kProgressTextID = 128;
  171.  
  172.     VAR myWindow: WindowPtr;
  173.         progressTextHdl: ControlHandle;
  174.         filesCount: SInt32;        { the number of files to be copied }
  175.     
  176.     BEGIN
  177.     { put up the window }
  178.     .....
  179.     
  180.     { create the Gauss control }
  181.     progressTextHdl := GetNewControl(kProgressTextID, myWindow);
  182.     
  183.     { setup the initial values }
  184.     SetControlReference(progressTextHdl, filesCount);
  185.     
  186.     { show the control }
  187.     ShowControl(progressTextHdl);
  188.     
  189.     { the copying loop }
  190.     WHILE filesCount >= 0 DO BEGIN
  191.     
  192.         { copy a file }
  193.         .....
  194.         
  195.         { update the counter; the Draw1Control call is needed because the Control Manager }
  196.         { does not force a redraw on the SetControlReference calls }
  197.         filesCount := filesCount - 1;
  198.         SetControlReference(progressTextHdl, filesCount);
  199.         Draw1Control(progressTextHdl);
  200.         
  201.         .....
  202.     END;
  203.  
  204.  
  205. Example #2: a Tips window
  206. +++++++++++++++++++++++++
  207. Do you know the Tips window in the Anarchie FTP client? I'll bet you know ;-). This is another situation where the Gauss CDEF might be helpful, though it cannot (yet) display styled text.
  208.  
  209. Goal: Displaying different blocks of text that exceed the 255 characters limit.
  210.  
  211. Core functionality: Draw the handle pointed to by the refCon field
  212.                     ** This means adding 4 to the procID field **
  213.  
  214. Appearance: Use the owning window's font characteristics, draw the 3D inset effect (and thus the boundary rectangle), honor deactivations, honor a 'cctb'
  215.                     ** This means adding 8 to the procID field **
  216.                     ** This means adding 1024 + 256 to the Max field **
  217.  
  218. Let's create the 'CNTL' ID 128 template like:
  219.  
  220.     BoundsRect: large enough to hold all the text
  221.     Value: 128 (fully justified, only to see what happens)
  222.     Visible: false
  223.     Max: 128 + 256 + 1024 = 1408 (remember, Max >= 128 always)
  224.     Min: -101 (inset effect)
  225.     ProcID: (CDEF ID * 16) + 4 + 8
  226.     RefCon: we'll set it in the code, of course
  227.     Title: ignored by the CDEF
  228.  
  229. The code then may looks like:
  230.  
  231.     CONST kTipsCtlID = 128;
  232.     
  233.     VAR myWindow: WindowPtr;
  234.         tipsTextHdl: Handle;
  235.         tipsCtlHdl: ControlHandle;
  236.     
  237.     BEGIN
  238.     
  239.     { put up the window }
  240.     .....
  241.     
  242.     { load one text resource from the application's resource file }
  243.     tipsTextHdl := Get1Resource('TEXT', 128);
  244.  
  245.     { create the Gauss control }
  246.     tipsCtlHdl := GetNewControl(kProgressTextID, myWindow);
  247.     
  248.     { store the text handle into the refCon of the Gauss control }
  249.     SetControlReference(progressTextHdl, SInt32(tipsTextHdl));
  250.     
  251.     { show the control }
  252.     ShowControl(progressTextHdl);
  253.  
  254.     { do any additional processing }
  255.     .....
  256.     
  257.     { dispose of the Gauss control }
  258.     DisposeControl(tipsCtlHdl);
  259.     
  260.     { release the text, since it is not needed anymore }
  261.     ReleaseResource(tipsTextHdl);
  262.  
  263.  
  264. Things to watch for
  265. -------------------
  266. - The contrlMax field should always be greater than 128, and the contrlMin field should always be less than -2: the Gauss CDEF need this to react properly to the changes of the text alignment you may specify with SetControlValue. I feel that a CDEF should not change these fields, since (theoretically) they are under the application's control, so I didn't burdened the code with additional checks.
  267.  
  268. - The contrlMax field transports the extended variation codes only at the control's creation, not at later times. Changing the contrlMax field after the control's creation does NOT result in the control assuming the new behavior.
  269.  
  270. - When you set the 4 variation code, allocating and releasing the storage for the text handle is your responsibility: the Gauss CDEF simply takes whatever it finds in the refCon and tries to use it as text. Moreover, don't lock this handle: the Gauss CDEF locks it and unlocks it by itself.
  271.  
  272. - The Gauss CDEF clips all its drawing to the control's boundary rectangle. This allows you to check whether the rectangle you specify is big enough or not.
  273.  
  274. - The Gauss CDEF draws the 3D-like effect (when you request it) only if the background color of the owning window is (R, G, B) = ($EEEE, $EEEE, $EEEE), as specified in the develop 15 article. If this color is different the Gauss CDEF refuses to draw the effect.
  275.  
  276. - The Gauss CDEF draws the dimmed text using the grayishTextOr transfer mode if it is available. When this is not available, the Gauss CDEF draws the text with a dithering pattern even on color screens, to achieve the disabled look.
  277.  
  278.  
  279. Part codes
  280. ----------
  281. The Gauss CDEF can only return 60 as part code to the TrackControl call.
  282.  
  283.  
  284. Color mapping of 'cctb' resources
  285. ---------------------------------
  286. When you add 2048 to the contrlMax field of the control template, the Gauss CDEF ignores any 'cctb' (control color table) resource that might be attached to the control. To have the Gauss CDEF honor your 'cctb' resource, be sure to NOT add 2048 to the contrlMax field. The Gauss CDEF maps the colors defined in your 'cctb' resource as follows:
  287.  
  288.     'cctb' part code            Gauss CDEF part
  289.     ================            =================
  290.     Frame color                    Frame color
  291.     Body color                    Body color
  292.     Text color                    Text color
  293.     Thumb color                    Ignored
  294.  
  295. When instead you specify to ignore the 'cctb' resources, the colors are:
  296.  
  297.     Frame color: black    Text color: black    Body color: background color of owning window
  298.  
  299.  
  300. What happens when ...
  301. ---------------------
  302. I have a Gauss control with the inset effect and I want to switch to the raised effect?
  303.  
  304. The Gauss CDEF may reposition the frame and the effect to draw the new effect within the control's boundary rectangle. However, the text stays always in the same position, regardless of which change the program requests. This is done to maintain consistency: indeed the Gauss CDEF shows the same behavior when a control intersects multiple screens, with at least one displaying the 3D effect and others not, because of different bit depths.
  305.  
  306.  
  307. Low memory conditions
  308. ---------------------
  309. The Gauss CDEF uses an offscreen drawing world to avoid unpleasant flickering effects. Since the Gauss controls may potentially span large screen areas, the CDEF does not keep the offscreen world between calls, but creates and destroys it at each drawing call. This technique does not seem to have much impact on performance.
  310.  
  311. If available memory is so low that the offscreen world cannot be created, the Gauss CDEF draws directly in the control's owning window; you should then expect to see some flickering, particularly if the control is inactive and the grayishTextOr transfer mode is not available.
  312.  
  313. Other problems may arise at initialization, when the Gauss CDEF allocates some memory for holding the number parts tables used in the number conversions. In these circumstances the CDEF behavior is unpredictable, and unfortunately a CDEF cannot return anything other than 0 from the initCntl message.
  314.  
  315. Finally, with all variation codes (excluding 4) the Gauss CDEF allocates memory for holding the text. If this memory is not available, the Gauss CDEF refuses to draw the text.
  316.  
  317.  
  318. Future Directions
  319. -----------------
  320. A very useful feature would be specifying and drawing multistyled text. Unfortunately this would be very difficult, requiring nontrivial modifications to the NeoTextBox source code.
  321.  
  322.  
  323. Credits and inspiration
  324. -----------------------
  325. NeoTextBox by Bryan K. Ressler, ported to Pascal by Peter N. Lewis
  326. "International Number Formatting" by Norbert Lindenberg in develop 16
  327.